package org.dbp.entrada.utils;

import java.io.File;
import java.io.OutputStreamWriter;
import java.io.StringWriter;
import java.util.Map;

import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.exception.MethodInvocationException;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
 * 
 * Es un utils que utilizamos para crear las plantillas.
 * 
 * @author dbp
 *
 */
public class TemplateUtils {

	private static final Logger logger = LoggerFactory.getLogger(TemplateUtils.class);
	
	  public static VelocityContext inicializarVelocity() throws Exception {
	        Velocity.init();
	        return new VelocityContext();
	    }

	    public static void crearDirectorio(String ruta) {
	        File fichero;
	        fichero = new File(ruta);
	        fichero.mkdir();
	    }
	    
	    
	    
	     /**
	      * Se encarga de generar 
	      * @param data
	      * @param keyPaquete
	      * @return 
	      */
	    
	    public static String convertirPaquetePath(String paquete){
	        return  String.format("%s%s"
	                ,System.getProperty("file.separator")
	                ,StringUtils.replace(paquete
	                    ,"."
	                    ,System.getProperty("file.separator"))
	                );
	    }
	    
	    
	     /**
	     * Se encarga de crear el fichero apartir de un   
	     * @param context	Es el contexto de velocity donde le pasamos las variables.
	     * @param template	La ruta donde se encuentra el template.
	     * @param sFichero	La ruta donde crearemos el fichero.
	     * @throws ResourceNotFoundException
	     * @throws ParseErrorException
	     * @throws MethodInvocationException
	     * @throws Exception
	     */
	        public static String generarTemplate(VelocityContext context,String template,String sFichero) throws ResourceNotFoundException, ParseErrorException, MethodInvocationException, Exception{
	                String valdev="";
	                StringWriter w = new StringWriter();
	                logger.info("Template --> [{}]",template);
	                Velocity.mergeTemplate(template,"UTF-8", context, w );
	                // Fichero
	                File fichero = new File(sFichero);
	                if(fichero.exists()==false){
	                	File directorio = new File(fichero.getParent());
	                	if(directorio.exists()==false){
	                		crearDirectorio(fichero.getParent());
	                	}
	                	FileUtils.writeStringToFile(fichero, w.toString());
	                }else{
	                    valdev=" El fichero ya existia : "+ sFichero;
	                    logger.warn(valdev);
	                }
	                return valdev;
	        }
	        
	        public static VelocityContext crearContexto(Map<String,Object> parametros){
	        	VelocityContext valdev=new VelocityContext();
	        	for(String clave:parametros.keySet()){
	        		valdev.put(clave, parametros.get(clave));
	        	}
	        	return valdev;
	        }
	    /**
	     * 
	     * Solo lo sacamos por pantalla
	     * 
	     * @param context
	     * @param template
	     * @throws ResourceNotFoundException
	     * @throws ParseErrorException
	     * @throws MethodInvocationException
	     * @throws Exception
	     */
	    public static String generarTemplate(VelocityContext context,String template) throws ResourceNotFoundException, ParseErrorException, MethodInvocationException, Exception{
	          StringWriter w = new StringWriter();
	          Velocity.mergeTemplate(template,Velocity.ENCODING_DEFAULT, context, w );
	          System.out.println(" INICIO " );
	          System.out.println( w );
	          System.out.println(" FIN " );
	          return w.toString();
	    }
	    
	    public static void generarTemplate(VelocityContext context,String template,OutputStreamWriter output) throws ResourceNotFoundException, ParseErrorException, MethodInvocationException, Exception{
	    	Velocity.mergeTemplate(template,Velocity.ENCODING_DEFAULT, context, output);
	    	output.flush();
	    }
}
